package com.sxf.rental.security;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.security.SecureRandom;

/**
 * PasswordConfig类是一个配置类，用于定义与密码编码相关的Bean。
 * 该类通过读取配置文件中的属性值来初始化密码编码器的强度和密钥。
 *
 * 属性：
 * - strength: 密码编码器的强度，从配置文件中读取，键为"encoder.ctype.strength"。
 * - secret: 用于生成安全随机数的密钥，从配置文件中读取，键为"encoder.ctype.secret"。
 */
@Configuration
@Data
public class PasswordConfig {
    @Value("${encoder.ctype.strength}")
    private int strength;

    @Value("${encoder.ctype.secret}")
    private String secret;

    /**
     * 创建并返回一个BCryptPasswordEncoder实例。
     *
     * 参数（通过类属性注入）：
     * - strength: BCryptPasswordEncoder的强度，决定密码哈希的计算复杂度。
     * - secret: 用于生成SecureRandom实例的种子，增强随机性。
     *
     * 返回值：
     * - 返回一个配置了指定强度和随机数生成器的BCryptPasswordEncoder实例。
     */
    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        // 使用secret作为种子创建SecureRandom实例，以增强随机性。
        SecureRandom secureRandom = new SecureRandom(secret.getBytes());

        // 返回一个BCryptPasswordEncoder实例，使用指定的强度和随机数生成器。
        return new BCryptPasswordEncoder(strength, secureRandom);
    }

}

